<?php
use frontend\modules\yii2\widgets\layouts\markdown\Markdown;
use frontend\modules\yii2\widgets\layouts\example\Example;
use yii\bootstrap\Button;
use yii\bootstrap\Alert;

$this->title = 'Yii2框架的安装教程及注意事项';
$this->registerMetaTag([
    'name' => 'keywords',
    'content' => 'yii,Yii2,install,安装,教程'
]);
$this->registerMetaTag([
    'name' => 'description',
    'content' => '介绍如何安装Yii的开发环境及相关注意事项'
]);
$this->registerMetaTag([
    'name' => 'author',
    'content' => 'chenzhiwei'
]);

$html = [
    "markdown0" => <<<M0
# Yii框架的安装
Yii框架的安装有很多方式，从[Yii官网](https://www.yiichina.com/doc/guide/2.0/start-installation)我们可以得到以下两种安装方法：
- 通过 Composer 安装；
- 通过归档文件安装，[源码下载](https://www.yiiframework.com/download)；

但是上述两种方法都需要建立在你本地有php环境的基础上，如果你是新入坑的小白，可能不具备自己安装php的能力，因此很多人会卡在php安装这一环节，不过幸运的是docker横空出世，而安装docker是一件轻而易举的事。

## Docker你爱过吗
**Docker你爱过吗？如果没有，那就爱了吧！！**  
Docker是一种容器，它能够在你的操作系统中独立运行一个子系统，而这个子系统会屏蔽操作系统之间的差异，也就是说无论你是windows系统还是linux系统，只要运行的docker镜像一致，那镜像中的服务就可以正常运行，而且服务所依赖的配置及环境都会保持高度一致。  
正是这个原因，docker容器屏蔽了开发环境/测试环境/生产环境所在操作系统的差异，最大程度地解决了来自程序员***“我本地可以正常跑的程序，在测试环境中怎么就有问题了？”***灵魂深处的呐喊。
> 为什么不能说Docker能完全屏蔽差异？因为电脑硬件资源不一致，因此容器能够使用的最大硬件资源会有差异。试想一下你本地开发环境16G内存，但是租的云服务器只有1G内存，而你的容器里的服务需要2G的内存才能运行正常，那你的容器是无法在云服务器中运行的。

由于docker的出色能力，目前比较流行的部署方案是给予docker的，比如说k8s；因此我们之后推荐的Yii安装方案都将会以docker为主。

**Docker很干净**  
如果你安装php，那你的电脑安装的东西就有点多，比如：nginx/apache/mysql，又比如php的各种扩展：xdebug/mysqli/openssl...  
这些库和扩展将会以铺天盖地之势安装到你的系统中，导致你的系统文件量越来越大，各种不知名的文件满系统飞。而如果你用的是docker，那这些安装文件全部都会被限制在容器中，哪天你不想要这个php了，直接删除容器，那这些文件就会一起删除，不给你本地的系统空间带来任何额外的浪费，这也是我喜欢docker的重要原因。

## 源码安装法
考虑到有很多同行已经在本地安装好php，想要快速入手yii，如果还要求再安装docker就有些过分了，其实我本人也讨厌安装额外的软件给系统增加负担，因此我也会介绍如何通过[源码安装](/docs/install-source)的方式安装yii。

## 官方docker容器安装法
Yii的作者强哥显然也看到了docker的发展前景，Yii官方也早早就发布了可以运行yii的docker镜像：[`yiisoftware/yii2-php`](https://hub.docker.com/r/yiisoftware/yii2-php)。  
使用官方推荐的镜像，那当然是好的，其镜像文档在[Github](https://github.com/yiisoft/yii2-docker.git)上，考虑到国内访问github会比较慢，我在同步了到了[Gitee](https://gitee.com/lvzmen_github/yii2-docker)中，但有如下遗憾：
- 无法快速同步最新的php版本，当php官方发布新的php版本时，如果yii官方没有及时发布基于最新php版本的镜像，那你将无法使用最新的php；
- Yii发布的镜像是定制好的，没办法按照我们自己的业务要求最小化安装php；

## 自定义php容器镜像
适合自己的才是最好的，php官方会很快发布基于最新版本的php容器镜像，但是这些镜像都是最小化安装php的，连最基本的mysqli扩展都没有，因此我们不能直接使用，需要二次扩展其镜像的功能，因此我们需要基于官方发布的php容器设计自己的Dockerfile文件，再基于此Dockerfile文件构建自己的php镜像。
M0,
];

foreach($html as $name => $item){
    switch ($name) {
        case strpos($name, "example") !== false:
            echo Example::widget($item);
            break;
        case strpos($name, "markdown") !== false:
            echo Markdown::widget(["content" => $item]);
            break;
        default:
            break;
    }
}